﻿#include<iostream>
#include <set>
using namespace std;


void TestSet1()
{
	// 用数组array中的元素构造set
	int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };  // 0到9之间的数字都有出现
	set<int> s(array, array + sizeof(array) / sizeof(array[0]));
	cout << s.size() << endl;
	// 正向打印set中的元素，从打印结果中可以看出：set可去重
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
	// 使用迭代器逆向打印set中的元素
	for (auto it = s.rbegin(); it != s.rend(); ++it)
		cout << *it << " ";
	cout << endl;
	// set中值为3的元素出现了几次
	cout << s.count(3) << endl;
}


#include <string>
#include <map>
void TestMap1()
{
	map<string, string> m;
	// 向map中插入元素的方式：
	// 将键值对<"peach","桃子">插入map中，用pair直接来构造键值对
	m.insert(pair<string, string>("peach", "桃子"));
	// 将键值对<"peach","桃子">插入map中，用make_pair函数来构造键值对
	m.insert(make_pair("banana", "香蕉"));

	// 将<"apple", "">插入map中，插入成功，返回value的引用，将“苹果”赋值给该引用结果
	m.insert(make_pair("apple", ""));
		m["apple"] = "苹果";

	cout << m.size() << endl;

	// 用迭代器去遍历map中的元素，可以得到一个按照key排序的序列
	for (auto& e : m)
		cout << e.first << "--->" << e.second << endl;
	cout << endl;
	// map中的键值对key一定是唯一的，如果key存在将插入失败
	auto ret = m.insert(make_pair("peach", "桃色"));
	if (ret.second)
		cout << "<peach, 桃色>不在map中, 已经插入" << endl;
	else
		cout << "键值为peach的元素已经存在：" << ret.first->first << "--->" << ret.first->second << " 插入失败" << endl;

	// 删除key为"apple"的元素
	m.erase("apple");
	if (1 == m.count("apple"))  
		cout << "apple还在" << endl;
	else
		cout << "apple被吃了" << endl;
}


#include <set>
void TestSet2()
{
	int array[] = { 2, 1, 3, 9, 6, 0, 5, 8, 4, 7, 8, 9, 4, 5};
	// 注意：multiset在底层实际存储的是<int, int>的键值对
	multiset<int> s(array, array + sizeof(array) / sizeof(array[0]));
	for (auto& e : s)
		cout << e << " ";
	cout << endl;
	return;
} 

//operator[]的底层逻辑
//V& operator[](const K& key)
//{
//	// 不管插入成功还是失败，pair中iterator始终指向key所在节点的iterator
//	pair<iterator, bool> ret = this->insert(make_pair(key, V()));
//	iterator it = ret.first;
//	return it->second;
//}
void test_map2()
{
	map<string, string> dict;
	dict.insert({ "string", "字符串" });

	// 插入（一般不会这么用）
	dict["right"];

	// 插入+修改
	dict["left"] = "左边";

	// "查找"
	cout << dict["string"] << endl;

	// 修改
	dict["right"] = "右边";
}

void test_map3()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
		"苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };
	map<string, int> countMap;
	for (auto& e : arr)
	{
		auto it = countMap.find(e);
		if (it != countMap.end())   //没找到就会返回npos
		{
			it->second++;
		}
		else
		{
			//countMap.insert({ e, 1 });
			countMap.insert(make_pair(e,1));
		}
	}

	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;
}

int main()
{
	//TestSet1();
	//TestMap1();
	//TestSet2();
	//test_map2();
	test_map3();
	return 0;
}